/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package arithserverrpc;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;

/**
 * Esta classe guarda a expressão de uma requisição e realiza as operações
 * básicas de aritmética
 * @author MCAS
 * 
 */
public class Operator {

    /**
     * Expressão matemática enviada por uma aplicação cliente
     */
    private String expression;

    public Operator() {
    }

    public Operator(String expression) {
        this.expression = expression;
    }

    /**
     * Este método realiza uma soma
     * @param a - primeiro operando
     * @param b - segundo operando
     * @return - o valor da soma em BigDecimal
     */
    public BigDecimal add(BigDecimal a, BigDecimal b) {
        BigDecimal result = a.add(b, new MathContext(5, RoundingMode.HALF_DOWN));

        return result;
    }

    /**
     * Este método realiza uma subtração
     * @param a - primeiro operando
     * @param b - segundo operando
     * @return - o valor da subtração em BigDecimal
     */
    public BigDecimal sub(BigDecimal a, BigDecimal b) {
        BigDecimal result = a.subtract(b, new MathContext(5, RoundingMode.HALF_DOWN));
        return result;
    }

    /**
     * Este método realiza uma multiplicação
     * @param a - primeiro operando
     * @param b - segundo operando
     * @return - o valor da multiplicação em BigDecimal
     */
    public BigDecimal mult(BigDecimal a, BigDecimal b) {
        BigDecimal result = a.multiply(b, new MathContext(5, RoundingMode.HALF_DOWN));
        return result;
    }

    /**
     * Este método realiza uma divisão
     * @param a - primeiro operando
     * @param b - segundo operando
     * @return - o valor da divisão em BigDecimal
     */
    public BigDecimal div(BigDecimal a, BigDecimal b) throws ArithmeticException{
        BigDecimal result = a.divide(b, new MathContext(5, RoundingMode.HALF_DOWN));
        return result;
    }

    /**
     * Este método extrai o primeiro operando da expressão
     * @return - retorna o primeiro operando
     */
    public String getOpA() {
        if (expression.startsWith("-")) {
            int k = 1;
            while (expression.charAt(k) != '-' && expression.charAt(k) != '+'
                    && expression.charAt(k) != '*' && expression.charAt(k) != '/') {
                k++;
            }
            return new String(expression.charAt(0) + expression.substring(1, k)).trim();
        } else if (expression.startsWith("+")) {
            int k = 1;
            while (expression.charAt(k) != '-' && expression.charAt(k) != '+'
                    && expression.charAt(k) != '*' && expression.charAt(k) != '/') {
                k++;
            }
            return expression.substring(1, k).trim();
        }
        int k = 0;
        while (expression.charAt(k) != '-' && expression.charAt(k) != '+'
                && expression.charAt(k) != '*' && expression.charAt(k) != '/') {
            k++;
        }
        return expression.substring(0, k).trim();
    }

    /**
     * Este método extrai o segundo operando da expressão
     * @return - retorna o segundo operando
     */
    public String getOpB() {
        int k = expression.length() - 1;
        while (expression.charAt(k) != '-' && expression.charAt(k) != '+'
                && expression.charAt(k) != '*' && expression.charAt(k) != '/') {
            k--;
        }
        return expression.substring(k + 1, expression.length()).trim();
    }

    public String getExpression() {
        return expression;
    }

    public void setExpression(String expression) {
        this.expression = expression;
    }
}
